package com.totcy.atom.net.api;


import com.totcy.atom.bean.AppVersion;
import com.totcy.atom.bean.BannerBean;
import com.totcy.atom.bean.DailySentenceCiBa;
import com.totcy.atom.bean.GankTypeBean;
import com.totcy.atom.bean.MMVideoBean;
import com.totcy.atom.bean.MMVideoResp;
import com.totcy.atom.bean.User;
import com.totcy.atom.bean.response.GankResponse;
import com.totcy.atom.bean.response.HeWeatherResponse;
import com.totcy.atom.bean.response.HttpResponse;
import com.totcy.atom.bean.response.VoidResponse;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import retrofit2.http.DELETE;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.QueryName;
import retrofit2.http.Url;

/**
 * * Get方法:  @GET("book/search") 这里的url拼接在baseUrl后面
 * <p>
 * #Query参数不传可以为null
 *
 * @Query ：   (拼接参数)
 * @Query("q") ：   List<String> name 多个相同的key参数
 * @QueryMap ：   (拼接多个参数)
 * @Path ：    拼接url （包括Post，Put，Delete等等）
 * @GET("book/{id}") Call<BookResponse> getBook(@Path("id") String id);
 * ***********************************************************************
 * Post方法 ：@POST("book/reviews") 这里的url拼接在baseUrl后面
 * field ：参数直接添加在请求体中
 * @field ： @Field("book") String bookId ; 单个参数
 * @FormUrlEncoded 将会自动将请求参数的类型调整为application/x-www-form-urlencoded，
 * 假如content传递的参数为Good Luck，那么最后得到的请求体就是content=Good+Luck
 * @FieldMap ：多个参数，放在一个map里面
 * @Body ：把参数都封装在一个类里面 （@Body Reviews reviews）
 * <p>
 * 【Put,Delete请求方式跟post类似】
 * <p>
 * 上传：
 * @Multipart
 * @POST("upload") 上传多个文件 添加多个MultipartBody.Part参数就行
 * Call<ResponseBody> uploadFile(@Part("description") RequestBody description,
 * @Part MultipartBody.Part file);
 * ***********************************************************************
 * 添加header
 * @Headers("Cache-Control: max-age=640000")
 * @Headers({"Accept: application/vnd.yourapi.v1.full+json","User-Agent: Your-App-Name"})
 * 传入完整的url地址，不适用baseUrl
 * profilePicture(@Url String url);
 * <p>
 * ***********************************************************************
 * <p>
 * <p>
 * description: Retrofit API接口类
 * 请求都采用   post+FormUrlEncoded键值对方式 FieldMap封装参数
 * author: Totcy
 * date: 2017/9/19 10:58
 * update: 2017/9/19
 */

public interface ApiService {

    /**
     * Post请求方式(不需要返回值的，默认解析VoidResponse类型)
     *
     * @param url    参数url（baseUrl后面部分）
     * @param params 参数map
     * @return 响应的基类
     */
    @FormUrlEncoded
    @POST("{url}")
    Observable<HttpResponse<VoidResponse>> executePost(@Path("url") String url, @FieldMap Map<String, Object> params);

    /**
     * Get请求方式(不需要返回值的，默认解析VoidResponse类型)
     *
     * @param url    参数url（baseUrl后面部分）
     * @param params 参数map0
     * @return 响应的基类
     */
    @GET("{url}")
    Observable<HttpResponse<VoidResponse>> executeGet(@Path("url") String url, @QueryMap Map<String, Object> params);

    @FormUrlEncoded
    @POST("v1/user/login")
    Observable<HttpResponse<User>> doLogin(@FieldMap Map<String, Object> params);

    @FormUrlEncoded
    @POST("v1/user/register")
    Observable<HttpResponse<User>> doRegister(@FieldMap Map<String, Object> params);

    /**
     * gank 接口数据
     *
     * @param url
     * @return
     */
    @GET
    Observable<GankResponse<List<GankTypeBean>>> getImageList(@Url String url);

    /**
     * 张涛 接口数据（http://www.kymjs.com）
     *
     * @param url
     * @return
     */
    @GET
    Observable<List<BannerBean>> getBannerList(@Url String url);

    /**
     * 词霸每日一句
     *
     * @param url
     * @return
     */
    @GET
    Observable<DailySentenceCiBa> getDailySentence(@Url String url, @QueryMap Map<String, Object> params);

    /**
     * 和风天气
     *
     * @param url
     * @return
     */
    @FormUrlEncoded
    @POST
    Observable<HeWeatherResponse> getWeatherInfo(@Url String url, @FieldMap Map<String, String> params);

    /**
     * app check update
     *
     * @param url
     * @return
     */
    @GET
    Observable<HttpResponse<AppVersion>> checkUpdate(@Url String url);

    @GET("v1/admin/links")
    Observable<HttpResponse<MMVideoResp>> getMMVideo(@Query("page_num") int pageNum);


}
